﻿/*!
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using System;
using System.Web;
using System.Web.Http;

namespace Pittypat.Web
{
    /// <summary>
    /// 定义 Pittypat 应用程序中的所有应用程序对象共有的方法、属性和事件。
    /// </summary>
    /// <remarks>
    /// 通常仅在 global.asax 文件中使用该类型，Pittypat 默认输出的 web 工程中不存在 global.asax.cs 文件。
    /// </remarks>
    public abstract class Application : HttpApplication
    {
        private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(Application));

        /// <summary>
        /// 初始化 <see cref="Application"/> 的新实例。
        /// </summary>
        protected Application()
        {
        }

        /// <summary>
        /// 配置当前应用程序。
        /// </summary>
        /// <param name="config">应用配置环境。</param>
        void InternalConfig(HttpConfiguration config)
        {
            // 截获所有请求并执行自定义的处理程序
            config.MessageHandlers.Add(new ApiHandler());

            // 功能路由
            config.Routes.MapHttpRoute(
                name: "function",
                routeTemplate: "{developer}/{app}/{module}/{function}"
            );

            // 默认路由
            config.Routes.MapHttpRoute(
                name: "default",
                routeTemplate: "{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }

        /// <summary>
        /// 应用程序生命周期启动时对应用程序进行配置。
        /// </summary>
        protected void Application_Start()
        {
            // 配置 log4net
            log4net.Config.XmlConfigurator.Configure();
            
            // 配置 WebApi
            try
            {
                GlobalConfiguration.Configure(InternalConfig);
            }
            catch (Exception exc)
            {
                Log.Fatal(exc.Message, exc);
            }
        }

        /// <summary>
        /// 当应用程序发生未处理的异常时记录异常到日志文件。
        /// </summary>
        /// <param name="sender">事件源。</param>
        /// <param name="args">事件参数。</param>
        protected void Application_Error(object sender, EventArgs args)
        {
            // 记录异常信息
            var error = Server.GetLastError();
            Log.Fatal(error.Message, error);

            // 记录异常后清空错误
            Server.ClearError();
        }
    }
}
